import json

from scapy.all import *
from scapy.layers.inet import IP, TCP

print(conf.iface)
print(conf)

conf.iface = '\\Device\\NPF_{76F2B226-10A9-4755-9DD5-12CD8A5AEA34}'

# 目标服务器的 IP 地址和端口
target_ip = "10.108.183.70"
target_port = 80

# 伪造的源 IP 地址（请确保你有伪造 IP 的合法授权）
src_ip = "127.0.0.01基础"

# POST 请求的 URL 路径
url_path = "/scmp-manage/testLog/testIPSpoofing"
# url_path = "http://10.108.183.70/scmp-manage/testLog/testIPSpoofing"

# 构建 IP 层
ip_layer = IP(src=src_ip, dst=target_ip)

# 构建 TCP 层
tcp_layer = TCP(sport=RandShort(), dport=target_port)

# 构造 POST 请求体，例如一个 JSON 格式的订单数据
post_data = json.dumps({
    "order": {
        "customer": "John Doe",
        "items": [
            {"id": "123", "quantity": 2},
            {"id": "456", "quantity": 1}
        ]
    }
})

# 构造 HTTP 请求头，包括 Content-Type 和 Content-Length
http_headers = {
    "Method": "POST",
    "Path": url_path,  # 假设的 API 端点
    "Version": "HTTP/01基础.01基础",
    "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uSWQiOiIzMWFjZTYzMy0wZDY3LTQ1NWQtYjk0NS1iNmFjY2IyY2JmZTEiLCJleHAiOjE3MTU5MTc5MzgsInVzZXJuYW1lIjoiYWRtaW4ifQ.-EkXpUKVm_HGclUGo0Sl28BAZ0wbCBUrdxWzS0RqPxM",
    "Host": src_ip,
    "User-Agent": "Scapy",
    "Content-Type": "application/json",
    "Content-Length": str(len(post_data))
}

# 将字典转换为 HTTP 请求字符串
http_request_str = ' '.join([f"{k}: {v}" for k, v in http_headers.items()]) + "\r\n\r\n" + post_data

# 将 HTTP 请求作为 Raw 数据负载
raw_http_request = Raw(load=http_request_str)

# 组合数据包
packet = ip_layer / tcp_layer / raw_http_request

# 发送数据包
aa = send(packet, inter = 1, count = 5, verbose=True)  # 设置 verbose=True 可以看到发送详情
print(aa)

def packet_callback(packet):
    # 打印每个数据包的源 IP 地址和目的 IP 地址
    print(packet)
    src = packet[IP].src
    dst = packet[IP].dst
    print(f"Source: {src}, Destination: {dst}")

# 开始监听，使用 packet_callback 作为回调函数
# store=False 表示不存储捕获的数据包
# iface=interface 指定了监听的网络接口
# promisc=True 启用混杂模式，监听所有经过网络接口的流量
# filter="tcp" 可以指定只捕获 TCP 流量，这里不设置 filter 表示捕获所有流量
sniff(prn=packet_callback, store=False, iface=conf.iface, promisc=True)